package base;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectInputStream.GetField;
import java.io.ObjectOutputStream;
import base.InstanciaDengue;
import base.Parametros;
import java.io.*;
import javax.swing.JPanel;

import weka.classifiers.Classifier;
import weka.classifiers.bayes.NaiveBayes;
import weka.classifiers.functions.MultilayerPerceptron;
import weka.classifiers.functions.SMO;
import weka.classifiers.rules.PART;
import weka.classifiers.trees.J48;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;

public class Classificador {

	
	Classifier classificador;
	Instances instancias;
	
	
	public void carregarInstancia(String pathInstancias) throws Exception{
		DataSource dados = new DataSource(pathInstancias);
		instancias = null;
		instancias = dados.getDataSet();
		instancias.setClassIndex(instancias.numAttributes()-1);
	}
			
	public void configurarInstancias(Parametros p) throws Exception{
		
		switch (p.tipoClassificador) {
			case Parametros.J48:
				classificador = new J48();
				break;

			case Parametros.PART:
				classificador = new PART();
				break;
				
			case Parametros.NAIVEBAYES:
				classificador = new NaiveBayes();
				break;
				
			case Parametros.SMO:
				classificador = new SMO();
				break;
				
			case Parametros.MULTILAYER_PERCEPTRON:
				MultilayerPerceptron mlp = new MultilayerPerceptron();
				/*mlp.setAutoBuild(true);
				mlp.setLearningRate(0.5);
				mlp.setMomentum(0.2);
				mlp.setTrainingTime(2000);
				mlp.setHiddenLayers("10");*/
				classificador = mlp;
				break;
				
			default:
				break;
		}
		
	}
	
	public void treinarClassificador() throws Exception{
		
		classificador.buildClassifier(instancias);
	}
	
	public void carregarClassificador(String pathArquivo) throws FileNotFoundException, IOException, ClassNotFoundException{
		
		ObjectInputStream arqClassificador = new ObjectInputStream(new FileInputStream(pathArquivo));
		classificador =  (Classifier) arqClassificador.readObject();
		arqClassificador.close();	
	}
	
	public void salverClassificador(String pathArquivo) throws FileNotFoundException, IOException, ClassNotFoundException{
		
		ObjectOutputStream arqClassificador = new ObjectOutputStream(new FileOutputStream(pathArquivo));
		arqClassificador.writeObject(classificador);
		arqClassificador.close();
	}
	
	public void testarInstancias() throws Exception{
		int corretas = 0;
		for (int i = 0; i < instancias.numInstances(); i++) {
			// Recuperamos cada uma das inst�ncias .
			Instance instancia = instancias.instance(i);
			// Classificamos esta inst�ncia .
			double classe =  classificador.classifyInstance(instancia);
			if (classe == instancia.classValue())
				corretas++;
		}
		// Relat�rio simples :
		System.out.println("De " + instancias.numInstances() + " inst�ncias , "
				+ corretas + " ("
				+ (100. * (corretas / (1.0 * instancias.numInstances())))
				+ "%) foram classificadas corretamente .");
		// De 178 inst�ncias , 176 (98.87640449438202%) foram classificadas
		// corretamente .
	}
	
	public void testarInstancia(InstanciaDengue instancia) throws Exception{
		
	}
	
        public String classificarNovaInstancia(String pathInstancias) throws IOException
        {
            FileReader reader;
            BufferedReader buffer;
            BufferedWriter writer = null;
            String text = "<html>";
            try
            {
                reader =  new FileReader(pathInstancias);
                buffer = new BufferedReader(reader);
                
                if(reader != null)
                {
                    Instances nao_rotulada = new Instances(buffer);

                    nao_rotulada.setClassIndex(nao_rotulada.numAttributes() -1);

                    Instances rotuladas = new Instances(nao_rotulada);

                    for(int i = 0; i< nao_rotulada.numInstances(); i++)
                    {
                        double cls_rotulo = classificador.classifyInstance(nao_rotulada.instance(i));
                        rotuladas.instance(i).setClassValue(cls_rotulo);
                        
                        text += cls_rotulo + " -> " + rotuladas.classAttribute().value((int) cls_rotulo) + "<br>";
                        //System.out.println(cls_rotulo + " -> " + rotuladas.classAttribute().value((int) cls_rotulo));
                    }
                    
                   text += "</html>";
                    //writer = new BufferedWriter(new FileWriter(arquivoSaida));
                    
                    //writer.write(rotuladas.toString());
                    //writer.flush();
                    
                }
            }
            catch(Exception ex)
            {
                
            }
            finally
            {
               
            }
          return text;
        }
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		try {
                    
                        /*Classificador teste = new Classificador();
			teste.carregarInstancia("./file/tabelaDengueFinal.arff");
			Parametros p = new Parametros();
			p.tipoClassificador = 3;
			teste.salverClassificador("./teste/tabelDengue.ser");
			teste.carregarClassificador("./teste/tabelDengue.ser");
			teste.configurarInstancias(p);
			teste.treinarClassificador();
			teste.carregarInstancia("./file/tabelaDengueFinalFilter.arff");
			teste.testarInstancias();*/
                    
                        String directorySrc = null, directorySave=null; 
                        
                        boolean kenelly = true;
                        boolean davi = false;
                        if(kenelly)
                        {
                            directorySrc = "C:\\Users\\Kenelly\\Documents\\NetBeansProjects\\JavaApplication1\\src\\file\\";
                            directorySave = "C:\\Users\\Kenelly\\Documents\\NetBeansProjects\\JavaApplication1\\src\\teste\\";
                            
                        }
                        if(davi)
                        {
                             directorySrc = "C:\\Users\\montenegrodr\\Documents\\NetBeansProjects\\JavaApplication1\\src\\file\\";
                             directorySave = "C:\\Users\\montenegrodr\\Documents\\NetBeansProjects\\JavaApplication1\\src\\teste\\";
                        }
                        
			Classificador teste = new Classificador();
			teste.carregarInstancia(directorySrc + "tabelaDengueFinal.arff");
			Parametros p = new Parametros();
			p.tipoClassificador = 0;
			teste.salverClassificador(directorySave + "TabelDengue.ser");
			teste.carregarClassificador(directorySave + "tabelDengue.ser");
			teste.configurarInstancias(p);
			teste.treinarClassificador();
			teste.carregarInstancia(directorySrc + "tabelaDengueFinalFilter.arff");
			teste.testarInstancias();
                        
                        
                        teste.classificarNovaInstancia( directorySrc + "nova_instancia1.arff");
			
			
			
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}


















